#include "VentanaDialogo.h"

#include <sstream>
#include <stdexcept>
#include <gtkmm/entry.h>
#include <gtkmm/menuitem.h>
#include <gtkmm/checkbutton.h>


VentanaDialogo::VentanaDialogo(Glib::RefPtr<Gtk::Builder> b, std::string nomWidget, std::string nomMenuItem, Gtk::Window& parentWin)
{
	// Guarda una referencia al builder para usarlo cuando sea necesario
	this->_builder = b;

	// Obtiene la ventana de dialogo desde el builder
	this->_pVentana = 0;
	this->_builder->get_widget(nomWidget, this->_pVentana);

	if (!this->_pVentana) throw std::runtime_error("Error, no se encontró '"+ nomWidget);

	// Conecta el cuadro de dialogo al menuItem correspondiente
	Gtk::MenuItem* pMenuItem = 0;
	this->_builder->get_widget(nomMenuItem, pMenuItem);
	
	if (!pMenuItem) throw std::runtime_error("Error, no se encontró '"+ nomMenuItem);

	pMenuItem->signal_activate().connect( sigc::mem_fun(*this, &VentanaDialogo::abrirDialogo) );

	// Setea al padre de la ventana
	this->_pVentana->set_transient_for(parentWin);
}


VentanaDialogo::~VentanaDialogo(){
}


// Abre al dialogo asociado a esta ventana de dialogo
void VentanaDialogo::abrirDialogo(){
	// Si existen parametros cargados los pasa a la ventana
	if (*this->_ppconfig != NULL){
		setearParametros();
		this->_pVentana->set_response_sensitive(0, true);
	} else {
		this->_pVentana->set_response_sensitive(0, false);
	}

	// Muestra la ventana y espera hasta que el usuario active
	// uno de los botones de accion
	int resul = this->_pVentana->run();

	// Oculta la ventana
	this->_pVentana->hide();

	// El "resul" señala que btn fue presionado
	if (resul == 0) aceptar();
	else cancelar();
}


void VentanaDialogo::setDataSource(Configuraciones** cfg){
	this->_ppconfig = cfg;
}


void VentanaDialogo::cargarParams(std::string nomEntry, unsigned short int val){
	std::stringstream ss;
	ss << val;
	cargarParams(nomEntry, ss.str());
}


void VentanaDialogo::cargarParams(std::string nomEntry, std::string cadena){
	Gtk::Entry* pEntry = 0;
	this->_builder->get_widget(nomEntry, pEntry);

	if (!pEntry) throw std::runtime_error("Error al buscar '"+nomEntry+"'");

	pEntry->set_text(cadena);
}


void VentanaDialogo::cargarParams(std::string nomChk, bool val){
	Gtk::CheckButton* pChk = 0;
	this->_builder->get_widget(nomChk, pChk);

	if (!pChk) throw std::runtime_error("Error al buscar '"+nomChk+"'");

	pChk->set_active(val);
}


void VentanaDialogo::obtenerDato(std::string nomEntry, std::string& dato){
	Gtk::Entry* pEntry = 0;
	this->_builder->get_widget(nomEntry, pEntry);

	if (!pEntry) throw std::runtime_error("Error al buscar '"+nomEntry+"'");

	dato =  pEntry->get_text();
}


void VentanaDialogo::obtenerDato(std::string nomEntry, unsigned short int& dato){
	std::string s;
	obtenerDato(nomEntry, s);

	std::stringstream ss(s);
	ss >> dato;
}


void VentanaDialogo::obtenerDato(std::string nomChk, bool& dato){
	Gtk::CheckButton* pChk = 0;
	this->_builder->get_widget(nomChk, pChk);

	if (!pChk) throw std::runtime_error("Error al buscar '"+nomChk+"'");

	dato = pChk->get_active();
}
